/*!
 * \file WtFilterMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 过滤管理器头文件
 * 
 * 本文件定义了过滤管理器类，主要功能包括：
 * - 策略信号过滤：对策略产生的交易信号进行过滤处理
 * - 合约代码过滤：对特定合约或品种进行过滤控制
 * - 执行器过滤：对执行器通道进行开关控制
 * - 动态配置加载：支持配置文件的动态重载
 * - 过滤动作支持：忽略信号或重定向到指定持仓
 * 
 * WtFilterMgr是WonderTrader系统中的风险控制组件，通过灵活的
 * 过滤机制实现对交易信号的精细化控制和风险管理。
 */
#pragma once
#include <string>
#include "../Includes/FasterDefs.h"
#include "../Includes/WTSMarcos.h"

NS_WTP_BEGIN

class EventNotifier;

/**
 * @class WtFilterMgr
 * @brief 过滤管理器类
 * 
 * 过滤管理器是WonderTrader系统中的重要风险控制组件，主要功能包括：
 * 1. 策略过滤：对指定策略的交易信号进行过滤处理
 * 2. 合约过滤：对特定合约或品种的交易信号进行过滤
 * 3. 执行器过滤：对执行器通道进行启用/禁用控制
 * 4. 配置管理：支持过滤配置的动态加载和重载
 * 5. 过滤动作：支持忽略信号和重定向持仓两种过滤方式
 * 
 * 该类通过配置文件定义过滤规则，支持运行时动态调整，
 * 为交易系统提供了灵活的风险控制能力。
 */
class WtFilterMgr
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化过滤管理器，设置过滤时间戳和事件通知器为空
	 */
	WtFilterMgr():_filter_timestamp(0), _notifier(NULL){}

	/**
	 * @brief 设置事件通知器
	 * @param notifier 事件通知器指针
	 * 
	 * 设置事件通知器，用于在过滤配置重载时发送通知
	 */
	void		set_notifier(EventNotifier* notifier) { _notifier = notifier; }

	/**
	 * @brief 加载信号过滤器
	 * @param fileName 过滤配置文件名，默认为空
	 * 
	 * 从配置文件加载过滤规则，支持以下过滤类型：
	 * - strategy_filters：策略过滤器配置
	 * - code_filters：合约/品种过滤器配置  
	 * - executer_filters：执行器过滤器配置
	 * 
	 * 支持配置文件的动态重载，当文件修改时自动重新加载
	 */
	void		load_filters(const char* fileName = "");

	/**
	 * @brief 检查策略是否被过滤器过滤
	 * @param straName 策略名称
	 * @param targetPos 目标持仓，以手数为准，可能被过滤器修改
	 * @param isDiff 是否为差量信号，默认为false
	 * @return 是否被过滤掉，如果被过滤掉，该持仓就不会被传递给执行器的目标持仓
	 * 
	 * 对策略信号进行过滤检查：
	 * - 如果配置为忽略，则返回true，信号被完全过滤
	 * - 如果配置为重定向，则返回false，但目标持仓会被调整为过滤器配置的值
	 * - 对于差量信号，如果被过滤则直接忽略
	 */
	bool		is_filtered_by_strategy(const char* straName, double& targetPos, bool isDiff = false);

	/**
	 * @brief 检查合约是否被过滤器过滤
	 * @param stdCode 标准合约代码
	 * @param targetPos 目标持仓，以手数为准，可能被过滤器修改
	 * @return 是否被过滤掉，如果被过滤掉，该持仓就不会被传递给执行器的目标持仓
	 * 
	 * 对合约代码进行过滤检查：
	 * - 首先检查完整合约代码的过滤规则
	 * - 如果没有匹配，再检查品种代码的过滤规则
	 * - 支持忽略和重定向两种过滤动作
	 */
	bool		is_filtered_by_code(const char* stdCode, double& targetPos);

	/**
	 * @brief 检查执行器是否被过滤器过滤
	 * @param execid 执行器通道ID
	 * @return 是否被过滤掉了，如果被过滤掉了，该执行器就不执行任何信号了
	 * 
	 * 检查指定执行器是否被禁用，被禁用的执行器不会接收任何交易信号
	 */
	bool		is_filtered_by_executer(const char* execid);

private:
	//////////////////////////////////////////////////////////////////////////
	//信号过滤器
	
	/**
	 * @brief 过滤动作枚举
	 * 
	 * 定义过滤器支持的动作类型
	 */
	typedef enum tagFilterAction
	{
		FA_Ignore,		///< 忽略，即维持原有持仓
		FA_Redirect,	///< 重定向持仓，即同时指定目标持仓
		FA_None = 99	///< 无效动作
	} FilterAction;

	/**
	 * @brief 过滤项结构体
	 * 
	 * 定义单个过滤规则的配置信息
	 */
	typedef struct _FilterItem
	{
		std::string		_key;		///< 关键字（策略名或合约代码）
		FilterAction	_action;	///< 过滤动作
		double			_target;	///< 目标持仓，只有当_action为FA_Redirect时有效
	} FilterItem;

	typedef faster_hashmap<LongKey, FilterItem>	FilterMap;
	FilterMap		_stra_filters;	///< 策略过滤器映射表

	FilterMap		_code_filters;	///< 代码过滤器，包括合约代码和品种代码，同一时间只有一个有效，合约代码的优先级高于品种代码

	//执行通道过滤器
	typedef faster_hashmap<LongKey, bool>	ExecuterFilters;
	ExecuterFilters	_exec_filters;	///< 执行器过滤器映射表

	std::string		_filter_file;		///< 过滤器配置文件路径
	uint64_t		_filter_timestamp;	///< 过滤器文件时间戳

	EventNotifier*	_notifier;			///< 事件通知器指针
};

NS_WTP_END

